# Create your views here.
from datetime import *
from django.shortcuts import render_to_response
from django.db.models import Q, Max, Min, Count
from django.http import HttpResponse,HttpResponseRedirect
from django.template import Context, loader, RequestContext
from django.contrib.auth import logout, authenticate, login 
from django.contrib.auth.models import *
from django.core.mail import send_mail

from django.contrib.auth.decorators import login_required
from widpy.widpylogin.forms import *
from widpy.data.models import *
import datetime, string

SEED = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456780'

def inicio(request):
	is_auth = request.user.is_authenticated()
	return render_to_response('webpage/inicio.html',{'username':request.user.username,'autenticado':is_auth}, context_instance = RequestContext(request))
  

def login_up(request, error_message=''):
	form = RegisterForm()   
	if request.session.get('has_login',False):
		return HttpResponseRedirect('/inicio/')	
	if request.method == 'POST':
		registrar = request.POST.get('registrar','')
		if registrar!='registrar':
			username = request.POST['username']
			password = request.POST['password']
			user = authenticate(username=username, password=password)
			if user is not None and user.is_active:
				login(request, user)
				request.session['has_login'] = True
				if next:
					return HttpResponseRedirect(next)
				return HttpResponseRedirect('/inicio/')
			else:
				return render_to_response('widpylogin/loginnew.html',{'error_message': 'Password o Username Invalido','form': form})	
		else:
			form = RegisterForm(request.POST)
			if form.is_valid():
				name_user = form.cleaned_data['username']
				firstname = form.cleaned_data['first_name']
				lastname = form.cleaned_data['last_name']
				email_user = form.cleaned_data['email']
				nacionalidad = form.cleaned_data['nacionalidad']
				pass_user = form.cleaned_data['password1']
				create_user = User(username= name_user, 
							   first_name = firstname,
							   last_name = lastname,
							   email= email_user,
							   nacionalidad = nacionalidad,
							   is_staff=False,
							   is_active=True,
							   is_superuser=False,
							   )
				create_user.set_password(pass_user)
				send_mail('Activacion WIDPY', 'Gracias por Unirte a este proyecto de la UCA', 'widpy.noreply@gmail.com',[email_user], fail_silently=False)
				create_user.save()
				######## Agregar datos de los cookies a la BD. #########
				#---Pestanha
				valormaximo = Pestanha.objects.aggregate(Max('id'))
				if valormaximo['id__max'] == None:
					nromax = 0
				else:
					nromax = valormaximo['id__max']
				#nromax = string.atoi(nromax1,10)
				#---Widget por Pestanha
				valor_key=Pestxwidxparam.objects.aggregate(Max('id'))
				if valor_key['id__max'] == None:
					keypestxwid=valor_key['id__max']
					keypestxwid=1
				else:
					keypestxwid=valor_key['id__max']
					keypestxwid=keypestxwid+1
				#-----
				idgoogleS = 0
				indx = 0
				Listapes = []
				Listatemas = []
				Nrolistatemas = []
				Listnrocolumna = []
				Listnromodelo = []
				Listwidxpestanha = []
				Listcandidadwidxpest = []
				if "nro_pes" in request.COOKIES and "t1" in request.COOKIES:
					cant_pes = request.COOKIES["nro_pes"]
					cpes = string.atoi(cant_pes,10)
					for i in range(1, cpes+1):
							Listapes.append(request.COOKIES["np"+str(i)])
							Listatemas.append(request.COOKIES["t"+str(i)])
							Nrolistatemas.append(request.COOKIES["nt"+str(i)])
							Listnrocolumna.append(request.COOKIES["cantida_columna"+str(i)])
							Listnromodelo.append(request.COOKIES["modelo_columna"+str(i)])
							Listwidxpestanha.append(request.COOKIES["widxpest"+str(i)])
							Listcandidadwidxpest.append(int(request.COOKIES["cantxwidxpest"+str(i)]))
						
					pesact = request.COOKIES["pes_active"]
					peac = string.atoi(cant_pes,10)
					cantidad_col=int(Listnrocolumna[0])
					modelo_col=int(Listnromodelo[0])
					nromax = nromax + 1
					
					if "idGS" in request.COOKIES:
						idgoogleS = int(request.COOKIES["idGS"])
					if "valor_buscado" in request.COOKIES:
						valsearch = request.COOKIES["valor_buscado"]
						
					#---Guarda todos los datos de la primera pestanha en la BD.
					fitroLayout= Q(cantidadcolumnas=cantidad_col) & Q(modelodecolumna=modelo_col)
					layoutAgregar = Layout.objects.get(fitroLayout) 
					pes_max = Pestanha.objects.filter(usuario=create_user.id)
					if(pes_max):
						num_max = pes_max.count()
					else:
						num_max = 1
					nuevapestanha = Pestanha(id=nromax, usuario_id=create_user.id, tema_id=Nrolistatemas[0], layout_id=layoutAgregar.id, nombre=Listapes[0], estado=1, nro_orden=num_max)
					nuevapestanha.save()
					
					if idgoogleS == 1:
						maxv = Pestxdatosxgoogle.objects.aggregate(Max('id'))
						if maxv['id__max'] == None:
							p = Pestxdatosxgoogle(id=1, usuario_id=create_user.id, pestanha=nuevapestanha, datos=valsearch)
						else:
							maxidgoogle = maxv['id__max']
							maxidgoogle = maxidgoogle + 1
							p = Pestxdatosxgoogle(id=maxidgoogle, usuario_id=create_user.id, pestanha=nuevapestanha, datos=valsearch)
							p.save()
					
					widxp = []
					for each in Listwidxpestanha[0].split('&'):
						widxp.append(each)
					
					for k in range(0, Listcandidadwidxpest[0]):	
						widACargar =  request.COOKIES[widxp[k]]
						ind = 0
						for each in widACargar.split('&'):
							if ind == 0:
								columna=int(each)
							if ind == 1:
								widaltura=int(each)
							if ind == 4:
								idwid=int(each)
							if ind==6:
								widcolor=each
							if ind==7:
								widestado=int(each)
							ind = ind + 1
						idwid1 = Widget.objects.get(id=idwid)	
						wxp=Pestxwidxparam(id=keypestxwid,pestanha=nuevapestanha,widget=idwid1,nrocolumna=columna,nrocajacontenedora=keypestxwid,altura=widaltura,color=widcolor,estado=widestado)
						wxp.save()
						#Nuevo valor maximo del id-Pestxwidxparam
						keypestxwid = keypestxwid + 1
					#Nuevo valor maximo del id-Pestanha	
					nromax = nromax + 1
					pes_max = Pestanha.objects.filter(usuario=create_user.id)
					if(pes_max):
						num_max = pes_max.count()
					else:
						num_max = 1
					num_max = num_max + 1 
					#---Guarda todos los datos de las siguientes n-1 pestanhas en la BD.
					for i in range(1, cpes):
						cantidad_col=int(Listnrocolumna[i])
						modelo_col=int(Listnromodelo[i])
						fitroLayout= Q(cantidadcolumnas=cantidad_col) & Q(modelodecolumna=modelo_col)
						layoutAgregar = Layout.objects.get(fitroLayout)
						
						nuevapestanha = Pestanha(id=nromax, usuario_id=create_user.id, tema_id=Nrolistatemas[i], layout_id=layoutAgregar.id, nombre=Listapes[i], estado=0, nro_orden=num_max)
						nuevapestanha.save()
						num_max = num_max + 1
						if idgoogleS == (i+1):
							maxv = Pestxdatosxgoogle.objects.aggregate(Max('id'))
							if maxv['id__max'] == None:
								p = Pestxdatosxgoogle(id=1, usuario_id=create_user.id, pestanha=nuevapestanha, datos=valsearch)
								p.save()
							else:
								maxidgoogle = maxv['id__max']
								maxidgoogle = maxidgoogle + 1
								p = Pestxdatosxgoogle(id=maxidgoogle, usuario_id=create_user.id, pestanha=nuevapestanha, datos=valsearch)
								p.save()
						
						widxp = []
						for each in Listwidxpestanha[i].split('&'):
							widxp.append(each)
						
						for k in range(0, Listcandidadwidxpest[i]):	
							widACargar =  request.COOKIES[widxp[k]]
							ind = 0
							for each in widACargar.split('&'):
								if ind == 0:
									columna=int(each)
								if ind == 1:
									widaltura=int(each)
								if ind == 4:
									idwid=int(each)
								if ind==6:
									widcolor=each
								if ind==7:
									widestado=int(each)
								ind = ind + 1

							idwid1 = Widget.objects.get(id=idwid)
							wxp=Pestxwidxparam(id=keypestxwid,pestanha=nuevapestanha,widget=idwid1,nrocolumna=columna,nrocajacontenedora=keypestxwid,altura=widaltura,color=widcolor,estado=widestado)
							wxp.save()
							#Nuevo valor maximo del id-Pestxwidxparam
							keypestxwid = keypestxwid + 1
							
						#Nuevo valor maximo del id-Pestanha
						nromax = nromax + 1
						
				else:
					nuevapestanha = Pestanha(id=nromax, usuario_id=create_user.id, tema_id=1, layout_id=1, nombre="Main", estado=1, nro_orden=1)
					nuevapestanha.save()
				form1 = RegisterForm()
				return render_to_response('widpylogin/loginnew.html',{'form': form1,'new_user':True})
			else:
				return render_to_response('widpylogin/loginnew.html',{'form': form})
	else:
		return render_to_response('widpylogin/loginnew.html',{'form': form})
	

@login_required
def mensajepv(request):
	nombre_usuario = request.user.get_full_name()	
	asunto = request.POST['asunto']
	cuerpo = request.POST['cuerpo']
	create_msj = MensajePrivado( usuario_id=request.user.id,
						destinatario = '',
						asunto = asunto,
						cuerpo = cuerpo,
						fecha = datetime.datetime.now(),)
	create_msj.save()
	if asunto == 'Desarrollador':
		pagina_web =  request.POST['url']
		usuario = User.objects.get(username = request.user.username)
		usuario.pagina_web = pagina_web
		usuario.save()
		create_propuesta = Propuesta(mensaje_id =create_msj.id,
									fecha = datetime.datetime.now(),
									descripcion = cuerpo,
									url = pagina_web,
									estado = False,) 
		create_propuesta.save()
		return HttpResponseRedirect('/inicio/')
	if asunto == 'Compartir':
		mail_to =  request.POST['mail']
		usuario = request.user.username
		user_mail = request.user.email 
		nombreWid = request.POST['nombre_widget']
		create_msj.destinatario = mail_to
		send_mail(asunto,"""%s\n\tEl usuario %s(%s) te invita a probar este gadget 
		%s.Visita www.widpy.com para mayor informacion.
		Si no estas registrado haz click aqui www.widpy.com/registrar. 
		Si ya eres miembro haz click aqui www.widpy.com/login.""" %(cuerpo ,usuario,user_mail,nombreWid), 'widpy.noreply@gmail.com',[mail_to], fail_silently=False)
		create_msj.save()
		return HttpResponseRedirect('/inicio/')

	else:
		return HttpResponseRedirect('/login/')


def logged_out(request):
	logout(request)
	return HttpResponseRedirect('/login/')

@login_required
def editar_perfil(request):
	user_id = request.user.id
	is_auth = request.user.is_authenticated()
	des=0
	administ=0
	superadmin=0
	grupo = 0
	if(is_auth):
		tipouser = User.objects.get(id=user_id)
		de = Q(groups__id='1') & Q(id=user_id)
		des = User.objects.filter(de)
		ad = Q(groups__id='2') & Q(id=user_id)
		administ = User.objects.filter(ad)
	
	if (des):
		grupo = grupo + 1
		des = 1
	else:
		des = 0
	if (administ):
		grupo = grupo + 1
		des = 0
		administ = 1
	else:
		administ = 0
	if (request.user.is_superuser):
		grupo = grupo + 1
		des = 0
		administ = 0
		superadmin = 1
	else:
		superadmin = 0
	Cancel = request.POST.get('Cancelar','')
	if request.method == 'POST':	 
		if  Cancel:
			return HttpResponseRedirect('/inicio/')
		edit_form = EditForm(request.POST, instance=request.user)
		if edit_form.is_valid():
			pass_user = edit_form.cleaned_data['password1']
			request.user.set_password(pass_user)
			edit_form.save()
			return HttpResponseRedirect('/inicio/')
	else:
		edit_form = EditForm(instance=request.user)
	return render_to_response('widpylogin/editar_perfil.html', { 'edit_form': edit_form , 'user_id':user_id, 'is_auth':is_auth ,'desarrollador' : des, 'admin' : administ, 'superadmin' : superadmin, 'nombreuser': tipouser.username, 'grupo': grupo}, context_instance=RequestContext(request))

@login_required
def solicitud(request):
	user_id = request.user.id
	is_auth = request.user.is_authenticated()
	des=0
	administ=0
	superadmin=0
	grupo = 0
	if(is_auth):
		tipouser = User.objects.get(id=user_id)
		de = Q(groups__id='1') & Q(id=user_id)
		des = User.objects.filter(de)
		ad = Q(groups__id='2') & Q(id=user_id)
		administ = User.objects.filter(ad)
	
	if (des):
		grupo = grupo + 1
		des = 1
	else:
		des = 0
	if (administ):
		grupo = grupo + 1
		des = 0
		administ = 1
	else:
		administ = 0
	if (request.user.is_superuser):
		grupo = grupo + 1
		des = 0
		administ = 0
		superadmin = 1
	else:
		superadmin = 0
	if request.user.is_staff==False or request.user.groups.filter(id=1):
		return HttpResponseRedirect('/inicio/')
	solicitudes = Propuesta.objects.filter(estado='0')[:5]
	if request.method == 'POST':
		rechazar = request.POST.get('Rechazar','')
		aceptar = request.POST.get('Aceptar','')
		usuario = request.POST.get('Usuario','')
		nro_solicitud = int(request.POST['nro'])
		user = User.objects.get(username=usuario)
		if rechazar:
			send_mail("Solicitud de Desarrollador", "Tu solicitud de ser desarrollador de Widpy ha sido rechazada!!", 'widpy.noreply@gmail.com',[user.email], fail_silently=False)
		if aceptar:
			user.pagina_web = solicitudes[nro_solicitud].url
			user.is_staff=True
			user.groups.add(1)
			user.save()
			send_mail("Solicitud de Desarrollador", "Tu solicitud de ser desarrollador de Widpy ha sido aceptada!!)", 'widpy.noreply@gmail.com',[user.email], fail_silently=False)
		solicitud = Propuesta.objects.get(pk=solicitudes[nro_solicitud].id)
		solicitud.estado = 1
		solicitud.save()
	return render_to_response("widpylogin/solicitudes.html",{'solicitudes':solicitudes,'user_id':user_id, 'is_auth':is_auth ,'desarrollador' : des, 'admin' : administ, 'superadmin' : superadmin, 'nombreuser': tipouser.username, 'grupo': grupo})

@login_required	
def cerrarCuenta(request):
	user = User.objects.get(username=request.user.username)
	logout(request)
	user.delete()
	return HttpResponseRedirect('/login/')

def random_pass(chars, length):
	import random,string
	return "".join( random.sample( chars*length, length ))  

def recovery(request):
	if request.method == 'POST':
		username =request.POST.get('Username','')
		mail = request.POST.get('Mail','')
		enviar_recovery=False
		if mail:
			user=User.objects.filter(email=mail)
			if user:
				enviar_recovery=True
		if username:
			user=User.objects.filter(username=username)
			if user:
				enviar_recovery=True	
		if enviar_recovery:
			new_pass = random_pass(SEED,8)
			user_new_pass = User.objects.get(username=user[0].username)
			user_new_pass.set_password(new_pass) 
			user_new_pass.save()
			send_mail("Recovery solicitado por el usuario","""El equipo de Widpy te envia tus datos para poder acceder a nuestra sistema
\nUser:%s\nPassword:%s\nEntra a editar perfil para cambiar tu password.\n\nEl equipo de Widpy."""
			%(user[0].username,new_pass),'widpy.noreply@gmail.com',[user[0].email], fail_silently=False)
		return HttpResponseRedirect('/login/')
		
